package 程序员面试金典;

/**
 * 面试题 03.01. 三合一
 * 三合一。描述如何只用一个数组来实现三个栈。
 *
 * 你应该实现push(stackNum, value)、pop(stackNum)、isEmpty(stackNum)、peek(stackNum)方法。stackNum表示栈下标，value表示压入的值。
 *
 * 构造函数会传入一个stackSize参数，代表每个栈的大小。
 *
 * 示例1:
 *
 *  输入：
 * ["TripleInOne", "push", "push", "pop", "pop", "pop", "isEmpty"]
 * [[1], [0, 1], [0, 2], [0], [0], [0], [0]]
 *  输出：
 * [null, null, null, 1, -1, -1, true]
 * 说明：当栈为空时`pop, peek`返回-1，当栈满时`push`不压入元素。
 * 示例2:
 *
 *  输入：
 * ["TripleInOne", "push", "push", "push", "pop", "pop", "pop", "peek"]
 * [[2], [0, 1], [0, 2], [0, 3], [0], [0], [0], [0]]
 *  输出：
 * [null, null, null, null, 2, 1, -1, -1]
 *
 *
 * 提示：
 *
 * 0 <= stackNum <= 2
 */
 class TripleInOne {

     int[][] arraysStack;

     int[] stackTop = new int[]{0,0,0}; //记录三个栈的栈顶位置

     int stackSize;


    public TripleInOne(int stackSize) {
        arraysStack = new int[3][stackSize];
        this.stackSize = stackSize;
    }

    public void push(int stackNum, int value) {

        if (stackTop[stackNum]<stackSize){
            arraysStack[stackNum][stackTop[stackNum]] = value;
            stackTop[stackNum]++;
        }

    }

    public int pop(int stackNum) {
        if (stackTop[stackNum]>0){
            int ans = arraysStack[stackNum][stackTop[stackNum]-1];
            stackTop[stackNum]--;
            return ans;
        }else {
            return -1;
        }
    }

    public int peek(int stackNum) {
        if (stackTop[stackNum]>0){
            return arraysStack[stackNum][stackTop[stackNum]-1];
        }else {
            return -1;
        }
    }

    public boolean isEmpty(int stackNum) {
        return stackTop[stackNum] == 0;
    }
}

public class T03_01 { }